// 六、ES6 中的类(上)

// 1.
// es5
// function Point(x, y) {
//   this.x = x;
//   this.y = y;
// }
// Point.prototype.getPosition = function () {
//   return '(' + this.x + ',' + this.y + ')';
// };
// var p1 = new Point(2, 3);
// console.log(p1);
// console.log(p1.getPosition());
// var p2 = new Point(4, 5);
// console.log(p2);
// console.log(p2.getPosition());

// es6
// class Point {
//   constructor(x, y) {
//     this.x = x;
//     this.y = y;
//   }
//   getPosition() {
//     return `(${this.x},${this.y})`;
//   }
// }
// var p1 = new Point(2, 3);
// console.log(p1);
// console.log(p1.getPosition());
// console.log(p1.hasOwnProperty('x'));
// console.log(p1.__proto__.hasOwnProperty('getPosition'));
// var p2 = new Point(4, 5);
// console.log(p2);
// console.log(p2.getPosition());

// 2.取值函数和存值函数

// es5
// var info = {
//   _age: 18,
//   set age(newValue) {
//     if (newValue > 18) {
//       console.log('怎么变老了');
//     } else {
//       console.log('我还年轻');
//     }
//   },
//   get age() {
//     console.log('你问我年龄干什么');
//     return this._age;
//   },
// };
// console.log(info.age);
// info.age=17

//es6
// class Info{
//   constructor(age){
//     this._age = age
//   }
//   set age(newAge){
//     console.log('newAge',newAge);
//     this._age = newAge
//   }
//   get age(){
//     return this._age
//   }
// }

// const info = new Info(18)
// info.age = 17
// console.log(info.age);

// 3.class表达式

// 函数两种形式
// const func = function () {

// }
// function func() {

// }

// class两种形式
// class Info{
//   constructor(){}
// }
// const Info = class {
//   constructor(){}
// }
// const testInfo = new Info()

// 4.静态方法 static

// function testFunc() {
// }
// console.log(testFunc.name);

// class Point {
//   constructor(x, y) {
//     this.x = x;
//     this.y = y;
//   }
//   getPosition() {
//     return `(${this.x},${this.y})`;
//   }
//   static getClassName() {
//     return Point.name
//   }
// }

// var p1 = new Point(2, 3);
// console.log(p1.getPosition());
// // console.log(p1.getClassName());
// console.log(Point.getClassName());

// 5.静态属性

// class Point{
//   constructor(){
//     this.x = 0
//   }
// }
// Point.y = 2
// const p = new Point()
// console.log(p.x);
// console.log(p.y);

// 6.私有方法
// 方式一、私有方法写在模块内
// class Point{
//   func1(){

//   }
//   _func2(){

//   }
// }
// 方式二、私有方法移出模块
// const _func2 = () => {};
// class Point {
//   func1() {
//     _func2.call(this)
//   }
// }
// 方式三、Symbol
// a.js
// const _func1 = Symbol('func1')
// export default class Point {

//   static [_func1](){

//   }
// }
// b.js
// import Point from "a.js";
// const p =new Point()
// console.log(p);

// 7.new.target 
// function Point() {
//   console.log(new.target);
// }
// const p = new Point()
// const p2 = Point()

// class Point {
//   constructor(){
//     console.log(new.target);
//   }
// }
// const p3 = new Point()

// 不能通过父类创建实例
// class Parent{
//   constructor(){
//     if(new.target === Parent){
//       throw new Error('不能实例化')
//     }
//   }
// }
// class Child extends Parent{
//   constructor(){
//     super()
//   }
// }
// const c = new Parent()